#!/usr/bin/perl

#  FILE:   utils.pl
#  AUTHOR: Luis Valverde Garcia
#  DATE:   26/11/01
#  LAST CHANGE: 14/12/2001
#
#  DESCRIPTION: 
#  Funciones varias de utilidad general



require ('init.pl');

#Lee un fichero html y lo escribe a la salida asignando a cada elemento input o textarea
#el valor del elemento del hash pasado como parametro que tiene por clave el nombre del primer elemento.
#Por ejemplo: sea un elemento  <input type="text" name="c1">, la funcion escribiria a la salida
# <input type="text" name="c1" value="$hash{c1}">
#importante: partimos de la base de que el documento HTML no contiene errores, si no el comportamiento
#puede ser impredecible y devastador (alejarse del ordenador)
sub loadForm {
	($entrada,$salida,%hash)=@_;
	local ($label,$rest,$pre);
	
	$rest='';	
	while (<$entrada>) {		
		$_=$rest.$_ if ($rest);
		while ( (/<input[^>]*>/i) || (/<textarea[^>]*>.*?<\/textarea>/i) ) {
			$label=$&;
			$rest=$';
			$pre=$`;						
			$label =~ /name\b*=\b*"?([-_\w]+)"?/i;
			$name=$1;
			print $salida $pre if ($pre);
			
			#campo de tipo input
			if ($label =~ /<input/) {
				$label =~ /type\b*=\b*"?(\w+)"?/i;
				$type=$1;				
					
				if ( (!$type) || ($type =~ /text/i) || ($type =~ /password/i) || ($type =~ /hidden/i) ) {					
					if (!($label =~ s/(value\b*=\b*)"?\w+"?/\1"$hash{$name}"/i) ) {
						$label =~ s/>/ value="$hash{$name}">/;
					}
				}
				elsif ( ($type =~ /checkbox/i) || ($type =~ /radio/i) ) {
					$label =~ /value\b*=\b*"?(\w+)"?/i;
					$value=$1;					
					if ($hash{$name} eq $value) {
						if (!($label =~ /checked/i) ) {
							$label =~ s/>/ checked>/;
						}
					}
					else {
						$label =~ s/checked//i;
					}
				}
			}
			
			#campo de tipo textarea
			elsif ($hash{$name}) {				
				$label =~ s/>.*?<\/textarea>/>$hash{$name}<\/textarea>/i;				
			}
				
			print $salida $label;
			$_=$rest;
		}
		
		if ( (! /<input/i) && (! /<textarea/i) ) {
			print $salida $_;
			$rest='';
		}
		else {
			$rest=$_;
		}
	}
}		

# reconstruye y devuelve un hash a partir del fichero de formato .kcn especificado
sub loadHash {
	($fichero)=@_;
	local ($clave,$valor);
	
	while (<$fichero>) {		
		if (/^>[^>]/) {
			if ($clave){				
				$valor =~ s/^>>/>/gm;
				$valor =~ s/\n\Z//;
				$input{$clave}=$valor;
				$valor='';
			}
			s/^>\s//;
			s/\n\Z//;
			$clave=$_;
		}
		else {
			$valor=join '',$valor,$_;
		}
	}
	if ($clave) {
		$valor =~ s/^>>/>/gm;
		$valor =~ s/\n\Z//;
		$input{$clave}=$valor;
	}
	
	return %input;		
}


# guarda todos los elementos del hash en un fichero con el formato:
# >clave1
# valor1
# >clave2
# valor2
# ...
sub saveHash {
	($fichero,%hash)=@_;
	local $clave;

	#$,="\nLuis es el mejor\n";
	foreach $clave(keys %hash) {
		$hash{$clave} =~ s/^>/>>/gm;
		print $fichero "> $clave\n$hash{$clave}\n";
	}	
}
